import restApi from './restapi';

function Friend(uuid, name, avatar) {
  this.uuid = uuid;
  this.name = name;
  this.avatar = avatar;
}

function Group(uuid, name, avatar) {
  this.uuid = uuid;
  this.name = name;
  this.avatar = avatar;
}

function IMService(goEasy, GoEasy) {
  //当前用户
  this.currentUser = null;
  //我的群
  this.groups = {};

  // GoEasy 模块
  this.GoEasy = GoEasy;

  //goEasy 实例对象
  this.goEasy = goEasy;

  //私聊消息记录，map格式，每个好友对应一个数组
  this.privateMessages = {};

  //群聊消息记录，map格式，每个群对应一个数组
  this.groupMessages = {};

  /*
   * 监听器们
   *
   * 可以在页面里，根据需求，重写以下监听器，
   * 便于当各种事件触发时，页面能够执行对应的响应
   *
   */
  //收到一条私聊消息
  this.onNewPrivateMessageReceive = function (friendId, message) {};
  //收到一条群聊消息
  this.onNewGroupMessageReceive = function (groupId, message) {};

}

//获取群成员
IMService.prototype.getGroupMembers = function (groupId) {
  let members = restApi.findGroupMembers(groupId);
  let membersMap = {};
  members.map(item => {
    membersMap[item.uuid] = item
  });
  return membersMap;
};

IMService.prototype.findGroupById = function (groupId) {
  let group = restApi.findGroupById(groupId);
  return new Group(group.uuid, group.name, group.avatar);
};

IMService.prototype.findFriendById = function (userId) {
  let user = restApi.findUserById(userId);
  return new Friend(user.uuid, user.name, user.avatar);
};

IMService.prototype.getGroupMessages = function (groupId) {
  if (!this.groupMessages[groupId]) {
    this.groupMessages[groupId] = [];
  }
  return this.groupMessages[groupId]
};

IMService.prototype.getPrivateMessages = function (friendId) {
  if (!this.privateMessages[friendId]) {
    this.privateMessages[friendId] = [];
  }
  return this.privateMessages[friendId];
};

//连接GoEasy
IMService.prototype.connect = function (currentUser) {
  this.currentUser = currentUser;
  let userData = {
    name: this.currentUser.name,
    avatar: this.currentUser.avatar
  }
  //初始化相关的监听器
  this.initialListeners();
  this.goEasy.connect({
    id: this.currentUser.uuid,
    data: userData,
    onSuccess: function () {
      //连接成功
      console.log("GoEasy connect successfully.")
    },
    onFailed: function (error) {
      //连接失败
      console.log("Failed to connect GoEasy, code:" + error.code + ",error:" + error.content);
    },
    onProgress: function (attempts) { //连接或自动重连中
      console.log("GoEasy is connecting", attempts);
    }
  });
  this.subscribeGroupMessage(currentUser);
};

IMService.prototype.subscribeGroupMessage = function () {
  let groups = restApi.findGroups(this.currentUser);
  let groupIds = groups.map(item => item.uuid);
  this.goEasy.im.subscribeGroup({
    groupIds: groupIds,
    onSuccess: function () {
      //订阅成功
      console.log('订阅群消息成功');
    },
    onFailed: function (error) {
      //订阅失败
      console.log('订阅群消息失败')
    }
  });
}

//初始化监听器
IMService.prototype.initialListeners = function () {
  //监听私聊消息
  this.goEasy.im.on(this.GoEasy.IM_EVENT.PRIVATE_MESSAGE_RECEIVED, (message) => {
    //更新私聊消息记录
    let friendId;
    if (this.currentUser.uuid === message.senderId) {
      friendId = message.receiverId;
    } else {
      friendId = message.senderId;
    }
    let friendMessages = this.getPrivateMessages(friendId);
    friendMessages.push(message);
    //如果页面传入了相应的listener，执行listener
    this.onNewPrivateMessageReceive(friendId, message);
  });

  //监听群聊消息
  this.goEasy.im.on(this.GoEasy.IM_EVENT.GROUP_MESSAGE_RECEIVED, (message) => {
    let groupId = message.groupId;
    //更新群聊消息记录
    let groupMessages = this.getGroupMessages(groupId);
    groupMessages.push(message);
    //如果页面传入了相应的listener，执行listener
    this.onNewGroupMessageReceive(groupId, message);
  })
};

export default IMService;